package jmine.tec.persist.naturalkey;

import java.io.Serializable;

import org.hibernate.Criteria;
import org.hibernate.criterion.MatchMode;

import bancosys.tec.persist.Persistable;

/**
 * Lida com criterias que devem receber restrições relativas à natural key
 * 
 * @author lundberg
 */
public interface NaturalKeyHandler {

    /**
     * Adiciona uma restrição de igualdade com a natural key passada. A restrição pode ser feita com ignoreCase caso assim esteja anotada a
     * entidade.
     * 
     * @param criteria criteria que deve ser configurado
     * @param naturalKey valor procurado da natural key
     * @throws InvalidNaturalKeyException caso não seja possível converter a natural key para o tipo correto.
     */
    void addRestrictionEq(Criteria criteria, Serializable naturalKey) throws InvalidNaturalKeyException;

    /**
     * Adiciona uma restrição do tipo "like", sempre case insensitive.
     * 
     * @param criteria criteria que deve ser configurado
     * @param naturalKey valor sendo procurado na natural key
     * @param matchMode tipo de match que deve ser utilizado
     * @throws InvalidNaturalKeyException caso não seja possível converter a natural key para o tipo correto.
     */
    void addRestrictionLike(Criteria criteria, Serializable naturalKey, MatchMode matchMode) throws InvalidNaturalKeyException;

    /**
     * Devolve a natural key da entidade
     * 
     * @param persistable {@link Persistable}
     * @return {@link Serializable}
     */
    Serializable getNaturalKey(Persistable persistable);

    /**
     * Adds to the criteria an asc order to the natural key
     * 
     * @param criteria criteria
     */
    void addOrderAsc(Criteria criteria);


    /**
     * @return target class of this handler  
     */
    Class<? extends Persistable> getTargetClass();
}
